package com.dxl.code_generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;
import java.util.List;

/**
 * @author dxl
 * @date 2020/12/15 13:28
 */



//代码自动生成器
public class MyBatisPlusGenerator {

    public static void main(String[] args) {
        //需要构建一个代码自动生成器对象
        AutoGenerator mpg = new AutoGenerator();
        //配置策略

        // 1.全局配置
        GlobalConfig gConfig=new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        // 作者
        gConfig.setAuthor("dxl")
        // 生成路径
        .setOutputDir(projectPath + "/src/main/java/")
        // 文件覆盖
        .setFileOverride(true)
        // 主键策略
        .setIdType(IdType.AUTO)
        // 设置生成的service接口的名字的首字母是否为I,例如IEmployeeService
        .setServiceName("%sService")
        //生成基本的resultMap
        .setBaseResultMap(true)
        //生成基本的SQL片段
        .setBaseColumnList(true)
        //生成后打开文件夹
        .setOpen(false)
        //生成日期类型
        .setDateType(DateType.ONLY_DATE)
        //生成swagger2文档
        .setSwagger2(true);

        mpg.setGlobalConfig(gConfig);//配置

        // 2. 数据源配置
        DataSourceConfig dsConfig = new DataSourceConfig();
        dsConfig.setDbType(DbType.MYSQL)
                .setUrl("jdbc:mysql://119.45.5.34:3306/mydb?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8")
                .setDriverName("com.mysql.cj.jdbc.Driver")
                .setUsername("root")
                .setPassword("dxlani001")
                .setTypeConvert(new MySqlTypeConvert() {
                    // 自定义数据库表字段类型转换【可选】
                    @Override
                    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                        System.out.println("转换类型：" + fieldType);
                        if (fieldType.toLowerCase().contains("tinyint")) {
                            return DbColumnType.INTEGER;
                        }
                        return super.processTypeConvert(globalConfig, fieldType);
                    }
                });

        mpg.setDataSource(dsConfig);//配置

        // 3.包名策略配置
        PackageConfig pkConfig = new PackageConfig();
        pkConfig.setParent("com.dxl")
                .setModuleName("blog")
                .setService("service")
                .setController("controller")
                .setEntity("entity")
                .setMapper("mapper");

        mpg.setPackageInfo(pkConfig); //配置

        // 4.策略配置
        StrategyConfig stConfig = new StrategyConfig();
        // 全局大写命名
        stConfig.setInclude("admin_copy","admin","listsong") //生成的表 生成修改表就行了
                .setCapitalMode(true) //大写命名
                .setNaming(NamingStrategy.underline_to_camel)
                .setColumnNaming(NamingStrategy.underline_to_camel)
                .setEntityLombokModel(true) //自动填充lombok
                .setRestControllerStyle(true) //生成 @RestController 控制器
                .setLogicDeleteFieldName("deleted"); //自动填充软删字段
                //.setTablePrefix("tbl_") //前缀不生成

                // 自定义需要填充的字段
                List<TableFill> tableFillList = new ArrayList<TableFill>();
                //如 每张表都有一个创建时间、修改时间
                //而且这基本上就是通用的了，新增时，创建时间和修改时间同时修改
                //修改时，修改时间会修改，
                //虽然像Mysql数据库有自动更新几只，但像ORACLE的数据库就没有了，
                //使用公共字段填充功能，就可以实现，自动按场景更新了。
                //如下是配置
                TableFill sysCreateTime = new TableFill("create_time", FieldFill.INSERT);
                TableFill sysUpdateTime = new TableFill("update_time", FieldFill.UPDATE);
                TableFill sysCreateBy = new TableFill("create_by", FieldFill.INSERT);
                TableFill sysUpdateBy = new TableFill("update_by", FieldFill.UPDATE);
                tableFillList.add(sysCreateTime);
                tableFillList.add(sysUpdateTime);
                tableFillList.add(sysCreateBy);
                tableFillList.add(sysUpdateBy);
                stConfig.setTableFillList(tableFillList);

                //乐观锁
                stConfig.setVersionFieldName("version");

                mpg.setStrategy(stConfig);//配置


        // 5. 执行
        mpg.execute();
    }


}